
/*
 * Copyright (C) Zhu Jiashun
 * Copyright (C) Zaver
 */

#ifndef PRIORITY_QUEUE_H
#define PRIORITY_QUEUE_H

#include "dbg.h"
#include "error.h"

#define ZV_PQ_DEFAULT_SIZE 10 // 默认堆的大小

typedef int (*zv_pq_comparator_pt)(void *pi, void *pj); // 比较子

// 优先队列，小顶堆，可参考算法四
typedef struct
{
    void **pq; // 堆数组
    size_t nalloc; // 已分配
    size_t size; // 数组大小
    zv_pq_comparator_pt comp; // 比较函数
} zv_pq_t;

int zv_pq_init(zv_pq_t *zv_pq, zv_pq_comparator_pt comp, size_t size); // 初始化
int zv_pq_is_empty(zv_pq_t *zv_pq); // 是否为空
size_t zv_pq_size(zv_pq_t *zv_pq); // 队列大小
void *zv_pq_min(zv_pq_t *zv_pq); // 最小
int zv_pq_delmin(zv_pq_t *zv_pq); // 删除最小
int zv_pq_insert(zv_pq_t *zv_pq, void *item); // 插入一个元素

int zv_pq_sink(zv_pq_t *zv_pq, size_t i); // 吐出元素
#endif
